{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c22488ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要的机器学习工具包\n",
    "from sklearn.model_selection import train_test_split  # 用于数据集划分\n",
    "import pandas as pd  # 用于数据处理和分析\n",
    "from sklearn.preprocessing import StandardScaler  # 用于数据标准化\n",
    "from sklearn.ensemble import RandomForestClassifier  # 随机森林分类器\n",
    "from sklearn.metrics import classification_report, confusion_matrix  # 模型评估指标\n",
    "from sklearn.model_selection import cross_val_score  # 交叉验证评分\n",
    "from sklearn.model_selection import GridSearchCV  # 网格搜索调优\n",
    "from sklearn.feature_selection import VarianceThreshold, SelectKBest, mutual_info_classif    #特征选择工具\n",
    "import numpy as np  # 科学计算基础库 \n",
    "import matplotlib.pyplot as plt  # 数据可视化\n",
    "import seaborn as sns  # 高级数据可视化\n",
    "from sklearn.model_selection import learning_curve    # 学习曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cdbc8fbc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置中文字体显示\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文显示为黑体\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "de19bbc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_df = pd.read_csv('training.csv')     # 读取训练集\n",
    "test_df = pd.read_csv('testing.csv')       # 读取测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "53271127",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   class  max_ndvi  20150720_N  20150602_N  20150517_N  20150501_N  \\\n",
      "0  water   997.904    637.5950     658.668   -1882.030    -1924.36   \n",
      "1  water   914.198    634.2400     593.705   -1625.790    -1672.32   \n",
      "2  water  3800.810   1671.3400    1206.880     449.735     1071.21   \n",
      "3  water   952.178     58.0174   -1599.160     210.714    -1052.63   \n",
      "4  water  1232.120     72.5180   -1220.880     380.436    -1256.93   \n",
      "\n",
      "   20150415_N  20150330_N  20150314_N  20150226_N  ...  20140610_N  \\\n",
      "0     997.904   -1739.990     630.087   -1628.240  ...    -921.193   \n",
      "1     914.198    -692.386     707.626   -1670.590  ...    -954.719   \n",
      "2     546.371    1077.840     214.564     849.599  ...    1562.210   \n",
      "3     578.807   -1564.630    -858.390     729.790  ...   -1025.880   \n",
      "4     515.805   -1413.180    -802.942     683.254  ...   -1813.950   \n",
      "\n",
      "   20140525_N  20140509_N  20140423_N  20140407_N  20140322_N  20140218_N  \\\n",
      "0   -1043.160   -1942.490     267.138     366.608     452.238     211.328   \n",
      "1    -933.934    -625.385     120.059     364.858     476.972     220.878   \n",
      "2    1566.160    2208.440    1056.600     385.203     300.560     293.730   \n",
      "3     368.622   -1786.950   -1227.800     304.621     291.336     369.214   \n",
      "4     155.624   -1189.710    -924.073     432.150     282.833     298.320   \n",
      "\n",
      "   20140202_N  20140117_N  20140101_N  \n",
      "0    -2203.02   -1180.190     433.906  \n",
      "1    -2250.00   -1360.560     524.075  \n",
      "2     2762.57     150.931    3800.810  \n",
      "3    -2202.12     600.359   -1343.550  \n",
      "4    -2197.36     626.379    -826.727  \n",
      "\n",
      "[5 rows x 29 columns]\n"
     ]
    }
   ],
   "source": [
    "# 检查数据的前几行看看数据结构是啥东东\n",
    "print(train_df.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "387b6932",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集: (10545, 29)\n",
      "测试集: (300, 29)\n"
     ]
    }
   ],
   "source": [
    "# 查看数据形状\n",
    "print(\"训练集:\",train_df.shape)    \n",
    "print(\"测试集:\",test_df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9e1df09c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "class          object\n",
       "max_ndvi      float64\n",
       "20150720_N    float64\n",
       "20150602_N    float64\n",
       "20150517_N    float64\n",
       "20150501_N    float64\n",
       "20150415_N    float64\n",
       "20150330_N    float64\n",
       "20150314_N    float64\n",
       "20150226_N    float64\n",
       "20150210_N    float64\n",
       "20150125_N    float64\n",
       "20150109_N    float64\n",
       "20141117_N    float64\n",
       "20141101_N    float64\n",
       "20141016_N    float64\n",
       "20140930_N    float64\n",
       "20140813_N    float64\n",
       "20140626_N    float64\n",
       "20140610_N    float64\n",
       "20140525_N    float64\n",
       "20140509_N    float64\n",
       "20140423_N    float64\n",
       "20140407_N    float64\n",
       "20140322_N    float64\n",
       "20140218_N    float64\n",
       "20140202_N    float64\n",
       "20140117_N    float64\n",
       "20140101_N    float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.dtypes   # 查看一下下数据类型，看看数据的格式是不是我想的那样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "0bf60a26",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "class         0\n",
       "max_ndvi      0\n",
       "20150720_N    0\n",
       "20150602_N    0\n",
       "20150517_N    0\n",
       "20150501_N    0\n",
       "20150415_N    0\n",
       "20150330_N    0\n",
       "20150314_N    0\n",
       "20150226_N    0\n",
       "20150210_N    0\n",
       "20150125_N    0\n",
       "20150109_N    0\n",
       "20141117_N    0\n",
       "20141101_N    0\n",
       "20141016_N    0\n",
       "20140930_N    0\n",
       "20140813_N    0\n",
       "20140626_N    0\n",
       "20140610_N    0\n",
       "20140525_N    0\n",
       "20140509_N    0\n",
       "20140423_N    0\n",
       "20140407_N    0\n",
       "20140322_N    0\n",
       "20140218_N    0\n",
       "20140202_N    0\n",
       "20140117_N    0\n",
       "20140101_N    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.isnull().sum()     #检查看看训练集有没有缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "27f1a101",
   "metadata": {},
   "outputs": [],
   "source": [
    "class_counts = train_df['class'].value_counts()    # .value_counts一下查看每个标签的样本数量和分布情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2345f1e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "forest        7431\n",
       "farm          1441\n",
       "impervious     969\n",
       "grass          446\n",
       "water          205\n",
       "orchard         53\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "19d7a07e",
   "metadata": {},
   "outputs": [],
   "source": [
    "class_test_counts = test_df['class'].value_counts()    # .value_counts一下查看每个标签的样本数量和分布情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "366d66b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "forest        78\n",
       "farm          53\n",
       "orchard       47\n",
       "water         46\n",
       "impervious    40\n",
       "grass         36\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_test_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "473c2c59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 6))    # 画布尺寸\n",
    "sns.barplot(x=class_counts.index, y=class_counts.values)    # 搞一个柱形图咯，x轴为类别，y轴是类别对应的样本数量\n",
    "plt.title('训练集中的类别分布')\n",
    "plt.xlabel('类别')\n",
    "plt.ylabel('样本数量')\n",
    "plt.show()    # 样本存在不均衡现象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "2aa2d1cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 找到所有的 NDVI 特征列 对数据降维，就降了一个一个就是max_ndvi：从卫星图像时间序列中计算的最大归一化差异植被指数值\n",
    "ndvi_columns = [col for col in train_df.columns if col.endswith('_N')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "3ed1973b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用 StandardScaler 进行标准化\n",
    "scaler = StandardScaler()\n",
    "train_df[ndvi_columns] = scaler.fit_transform(train_df[ndvi_columns])    # 对训练集的 NDVI 特征进行拟合和转换\n",
    "test_df[ndvi_columns] = scaler.transform(test_df[ndvi_columns])    # 对测试集的 NDVI 特征仅进行转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "284a1a83",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_df['class'] = train_df['class'].astype('category')  # 将类别变量转换为category类型优化内存和计算，其实不转换也没事我电脑配置还不错\n",
    "test_df['class'] = test_df['class'].astype('category')  # 对测试集也进行相同转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4fe82e57",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集标准化后的数据:\n",
      "    20150720_N  20150602_N  20150517_N  20150501_N  20150415_N  20150330_N  \\\n",
      "0   -2.222679   -1.505884   -2.172089   -2.787266   -0.700395   -2.574799   \n",
      "1   -2.224148   -1.529636   -2.082822   -2.686933   -0.731688   -2.168467   \n",
      "2   -1.770044   -1.305449   -1.359764   -1.594782   -0.869196   -1.481853   \n",
      "3   -2.476453   -2.331381   -1.443032   -2.440246   -0.857070   -2.506783   \n",
      "4   -2.470104   -2.193076   -1.383906   -2.521574   -0.880622   -2.448040   \n",
      "\n",
      "   20150314_N  20150226_N  20150210_N  20150125_N  ...  20140610_N  \\\n",
      "0   -1.118546   -2.426676   -2.007054   -2.174305  ...   -2.079513   \n",
      "1   -1.086520   -2.442412   -2.036935   -2.190580  ...   -2.091725   \n",
      "2   -1.290165   -1.505981   -1.067682   -1.364550  ...   -1.174879   \n",
      "3   -1.733315   -1.550499   -2.668217   -2.382270  ...   -2.117647   \n",
      "4   -1.710414   -1.567790   -2.548427   -2.290767  ...   -2.404719   \n",
      "\n",
      "   20140525_N  20140509_N  20140423_N  20140407_N  20140322_N  20140218_N  \\\n",
      "0   -2.037936   -2.419424   -1.265928   -0.829043   -0.929905   -0.835011   \n",
      "1   -1.990409   -1.778225   -1.333513   -0.829909   -0.919635   -0.830694   \n",
      "2   -0.902547   -0.398648   -0.903157   -0.819839   -0.992890   -0.797757   \n",
      "3   -1.423629   -2.343704   -1.952875   -0.859723   -0.996721   -0.763631   \n",
      "4   -1.516311   -2.052952   -1.813308   -0.796603   -1.000251   -0.795682   \n",
      "\n",
      "   20140202_N  20140117_N  20140101_N  \n",
      "0   -4.274743   -1.602652   -0.880386  \n",
      "1   -4.298903   -1.679867   -0.843029  \n",
      "2   -1.721112   -1.032809    0.514507  \n",
      "3   -4.274280   -0.840412   -1.616778  \n",
      "4   -4.271833   -0.829273   -1.402660  \n",
      "\n",
      "[5 rows x 27 columns]\n"
     ]
    }
   ],
   "source": [
    "# 查看标准化后的数据是什么样\n",
    "print(\"训练集标准化后的数据:\\n\",train_df[ndvi_columns].head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7cf62b84",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集标准化后的数据:\n",
      "    20150720_N  20150602_N  20150517_N  20150501_N  20150415_N  20150330_N  \\\n",
      "0   -1.905540   -1.837196   -1.698002   -2.468621   -0.081625   -2.002471   \n",
      "1   -1.730851   -1.570806   -1.514257   -1.862397   -0.084179   -1.686205   \n",
      "2   -0.965136   -1.834934   -1.948186   -2.152734   -0.603464   -1.967856   \n",
      "3   -1.565411   -1.792839   -1.698388   -2.316256   -0.200648   -1.980371   \n",
      "4   -1.627976   -2.123130   -0.919460   -2.209210   -0.128763   -1.935497   \n",
      "\n",
      "   20150314_N  20150226_N  20150210_N  20150125_N  ...  20140610_N  \\\n",
      "0   -1.567313   -1.048483   -2.264747   -2.620866  ...   -0.876982   \n",
      "1   -1.340500   -1.008658   -1.907478   -1.874894  ...   -1.011875   \n",
      "2   -1.500418   -2.310307   -0.634634   -2.304150  ...   -1.074231   \n",
      "3   -1.410573   -0.773661   -2.043746   -2.368599  ...   -0.979506   \n",
      "4   -1.439178   -0.897305   -1.103122   -2.195050  ...   -0.766196   \n",
      "\n",
      "   20140525_N  20140509_N  20140423_N  20140407_N  20140322_N  20140218_N  \\\n",
      "0   -1.114785   -0.608182   -0.160116   -1.099078   -0.188120   -0.478111   \n",
      "1   -1.112479   -0.485751   -0.913588   -1.020204   -0.210926   -0.511059   \n",
      "2   -0.914473   -1.061537   -0.944948   -1.242145   -1.210015   -0.422282   \n",
      "3   -1.155663   -0.383610   -1.115787   -0.247836   -0.121746   -0.547865   \n",
      "4   -0.960858   -0.414981   -0.781344   -0.341530   -0.128585   -0.536825   \n",
      "\n",
      "   20140202_N  20140117_N  20140101_N  \n",
      "0   -3.183740   -0.606715   -1.709141  \n",
      "1   -2.797891   -0.446831   -1.295874  \n",
      "2   -2.559195   -0.843109   -1.471819  \n",
      "3   -2.847488   -0.535930   -1.638715  \n",
      "4   -2.537889   -0.672998   -1.136929  \n",
      "\n",
      "[5 rows x 27 columns]\n"
     ]
    }
   ],
   "source": [
    "print(\"测试集标准化后的数据:\\n\",test_df[ndvi_columns].head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "b524514d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 开始划分特征和目标变量了\n",
    "X_train = train_df[ndvi_columns]  # 训练集的特征列\n",
    "y_train = train_df['class']       # 训练集标签\n",
    "X_test = test_df[ndvi_columns]    # 测试集特征\n",
    "y_test = test_df['class']         # 测试集标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "ce9e112d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "方差过滤后保留的特征: 27个\n",
      "['20150720_N' '20150602_N' '20150517_N' '20150501_N' '20150415_N'\n",
      " '20150330_N' '20150314_N' '20150226_N' '20150210_N' '20150125_N'\n",
      " '20150109_N' '20141117_N' '20141101_N' '20141016_N' '20140930_N'\n",
      " '20140813_N' '20140626_N' '20140610_N' '20140525_N' '20140509_N'\n",
      " '20140423_N' '20140407_N' '20140322_N' '20140218_N' '20140202_N'\n",
      " '20140117_N' '20140101_N']\n"
     ]
    }
   ],
   "source": [
    "# 方差过滤（保留方差大于0.1的特征）\n",
    "sv = VarianceThreshold(threshold=0.1)\n",
    "X_train_variance = sv.fit_transform(X_train)\n",
    "X_test_variance = sv.transform(X_test)\n",
    "# 获取保留的特征名称\n",
    "sfv = np.array(ndvi_columns)[sv.get_support()]\n",
    "print(f\"方差过滤后保留的特征: {len(sfv)}个\")\n",
    "print(sfv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "31cdc10e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 获取方差过滤后的特征数量上限\n",
    "# max_features = len(sfv)\n",
    "\n",
    "# # 评估不同k值的性能\n",
    "# k_range = range(5, max_features + 1)  # 从5开始到最大可用特征数\n",
    "# cv_scores_k = []\n",
    "\n",
    "# for k in k_range:\n",
    "#     selector = SelectKBest(score_func=mutual_info_classif, k=k)\n",
    "#     X_train_k = selector.fit_transform(X_train_variance, y_train)\n",
    "    \n",
    "#     # 使用简化模型配置快速评估\n",
    "#     model = RandomForestClassifier(\n",
    "#         n_estimators=100, \n",
    "#         class_weight='balanced',\n",
    "#         random_state=42,\n",
    "#         n_jobs=-1\n",
    "#     )\n",
    "    \n",
    "#     # 交叉验证\n",
    "#     scores = cross_val_score(model, X_train_k, y_train, cv=10, scoring='f1_macro',n_jobs=-1)\n",
    "#     cv_scores_k.append(scores.mean())\n",
    "    \n",
    "#     print(f\"k={k}, 交叉验证平均分: {scores.mean():.4f}\")\n",
    "\n",
    "# # 可视化结果\n",
    "# plt.figure(figsize=(10, 6))\n",
    "# plt.plot(k_range, cv_scores_k, 'o-')\n",
    "# plt.title('不同特征数量(k)的性能表现')\n",
    "# plt.xlabel('特征数量 k')\n",
    "# plt.ylabel('交叉验证 F1 分数')\n",
    "# plt.grid(True)\n",
    "# plt.show()\n",
    "\n",
    "# # 找出最佳k值\n",
    "# best_k = k_range[np.argmax(cv_scores_k)]\n",
    "# print(f\"最佳特征数量: k={best_k}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "92df7b2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 互信息特征选择（保留前n个最相关的特征）\n",
    "selector_mutual_info = SelectKBest(score_func=mutual_info_classif, k=25)    \n",
    "X_train_filtered = selector_mutual_info.fit_transform(X_train_variance, y_train)\n",
    "X_test_filtered = selector_mutual_info.transform(X_test_variance)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "e7d1c47a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最终选择 25 个特征: ['20150720_N', '20150602_N', '20150517_N', '20150501_N', '20150415_N', '20150330_N', '20150314_N', '20150226_N', '20150210_N', '20150125_N', '20141117_N', '20141016_N', '20140930_N', '20140813_N', '20140626_N', '20140610_N', '20140525_N', '20140509_N', '20140423_N', '20140407_N', '20140322_N', '20140218_N', '20140202_N', '20140117_N', '20140101_N']\n"
     ]
    }
   ],
   "source": [
    "# 获取最终选择的特征名称\n",
    "selected_indices = selector_mutual_info.get_support(indices=True)\n",
    "final_features = [sfv[i] for i in selected_indices]\n",
    "print(f\"最终选择 {len(final_features)} 个特征:\", final_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "384be90a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# # 定义参数网格\n",
    "# param_grid = {\n",
    "#     'n_estimators': [100, 150,200,250,300],          # 树的数量\n",
    "#     'max_depth': [3, 4, 5,6,7],                    # 树的最大深度\n",
    "#     'max_features': [0.5, 0.6, 'sqrt','log2'],        # 每次分裂考虑的特征比例\n",
    "#     'min_samples_split': [3,4, 5, 6],          # 节点分裂所需的最小样本数\n",
    "#     'min_samples_leaf': [3,4, 5, 6],            # 叶子节点所需的最小样本数\n",
    "#     'class_weight': [class_weights],    # 类别权重策略\n",
    "#     'bootstrap': [True]                       # 禁用自助采样\n",
    "# }\n",
    "# rfc = RandomForestClassifier(random_state=42, n_jobs=-1)\n",
    "# # 初始化网格搜索\n",
    "# grid_search = GridSearchCV(\n",
    "#     estimator=rfc,\n",
    "#     param_grid=param_grid,\n",
    "#     cv=10,                        # 10折交叉验证\n",
    "#     scoring='f1_macro',           # 使用F1宏平均作为评分标准\n",
    "#     n_jobs=-1,                    # 并行计算\n",
    "#     verbose=2                     # 显示详细搜索过程\n",
    "# )\n",
    "\n",
    "# # 执行网格搜索\n",
    "# print(\"开始网格搜索...\")\n",
    "# grid_search.fit(X_train_filtered, y_train)\n",
    "\n",
    "# # 输出最佳参数和最佳分数\n",
    "# print(\"\\n最佳参数组合:\")\n",
    "# for param, value in grid_search.best_params_.items():\n",
    "#     print(f\"{param}: {value}\")\n",
    "# print(f\"\\n最佳交叉验证F1分数: {grid_search.best_score_:.4f}\")\n",
    "\n",
    "# # 使用最佳参数的模型进行后续分析\n",
    "# rfc = grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "710e70e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomForestClassifier(class_weight={'farm': 7.317834836918807,\n",
       "                                     'forest': 1.4190553088413402,\n",
       "                                     'grass': 23.643497757847534,\n",
       "                                     'impervious': 10.882352941176471,\n",
       "                                     'orchard': 198.96226415094338,\n",
       "                                     'water': 51.4390243902439},\n",
       "                       max_depth=6, max_features='log2', min_samples_leaf=3,\n",
       "                       min_samples_split=5, n_estimators=200, n_jobs=-1,\n",
       "                       random_state=42)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_weights = {\n",
    "    'forest': 10545 / 7431,      # ≈1.41\n",
    "    'farm': 10545 / 1441,        # ≈7.31\n",
    "    'impervious': 10545 / 969,   # ≈10.88\n",
    "    'grass': 10545 / 446,        # ≈23.64\n",
    "    'water': 10545 / 205,        # ≈51.43\n",
    "    'orchard': 10545 / 53        # ≈198.96\n",
    "\n",
    "}\n",
    "\n",
    "# 初始化随机森林模型\n",
    "rfc = RandomForestClassifier(\n",
    "    n_estimators=200,          # 增加树的数量\n",
    "    max_depth=6,               # 增加树的最大深度\n",
    "    max_features='log2',          # 每次分裂考虑的特征比例\n",
    "    min_samples_split=5,       # 增加节点分裂所需的最小样本数\n",
    "    min_samples_leaf=3,        # 增加叶子节点所需的最小样本数\n",
    "    class_weight=class_weights,  # 使用自定义类别权重\n",
    "    random_state=42,\n",
    "    bootstrap=True,\n",
    "    n_jobs=-1\n",
    "\n",
    ")\n",
    "rfc.fit(X_train_filtered, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "c4313ab3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "10折交叉验证分数: [0.5474 0.6643 0.8293 0.8064 0.771  0.7513 0.8261 0.7961 0.7446 0.5985]\n",
      "交叉验证平均分: 0.7335\n"
     ]
    }
   ],
   "source": [
    "cv_scores = cross_val_score(rfc, X_train_filtered, y_train,cv=10, n_jobs=-1, scoring='f1_macro')\n",
    "print(f\"\\n10折交叉验证分数: {np.round(cv_scores, 4)}\")\n",
    "print(f\"交叉验证平均分: {cv_scores.mean():.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "8743bae7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAETCAYAAADZHBoWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA0v0lEQVR4nO3dd3xV9f3H8dcnm5AFZLL3DiCEKSMgDuLGvWu1DtTa/rTu2tbaWmnV2joqVq2Co7gXODBhSoAgG8KUJMwEAiRACBmf3x/3EpAGCJCbc8fn+Xjw4N6bc+755Irnfc/3fIeoKsYYYwxAkNMFGGOM8R4WCsYYY2pYKBhjjKlhoWCMMaaGhYIxxpgaFgrGGGNqWCgYvyYi00XkQg++f5yIfCoiLWv5WR8RufEU37er++/2IjLqGNvcLSIRIpIpIqki8hsRiRGRV0Rk+Kkc1xgLBePvfgDOru0HIrJSRPJFZL2I5B71Z52IzDxi20tFZKGIzBaRZSLS2/2jG4AU4Ge1HGIn8JSIDBGRe0RktYj8ICJLRWSJiOS4j/WT0BKR84EPREQABSaISGQt7x8CPAZUAo2Bq1W1BBgFbDqJz8iYGiFOF2BMfRGRYOBHoAjXyRRAABWRHPfzICARGKmq3UXkXqCbqt4hIi1VdZP7vf4KNDr03qr6sYjkqGqBiHwB7BGRaOBWIB34UERmqurMI/YpEJGfAQWq+j3wT/d7/x7Yrap/r+V3CAJ+BzyqrpGlP4rIFODvwG1HbBcBbHH/nk3cNcx0XyFEqeoG93bhqlp+8p+mCVR2pWD8hqpWqWprIA1YCPxVVfupahowHsgFhgNtgHXu3T4CLhaRWGC+iPRwv34x8N+jDjHD/Xc8ruB5CfiHqu4CrgP+ISKPiEjMETV9q6oFJ/Fr3A/sUdVPj3jtEWCIiDzjvnoACHP/Lte5f9/uuALwTiDIfRVSCKx0h5cxdWKhYPyKiEQBk4C+HD6JA3wNVOEKi97ub+G4T9i5wFnAH4HHReQs14901lFvX+L+OwIYg6vJZpyILAS+BGYCfYD2IvKwiHwrIt8favoRkbNF5JhX5+7j/oojrgjcNe7F1SQ0GtfVQBegDNgAbAZmAbuBXUAH4AV3EGbialIqPcHHZkwNaz4y/mYCrmafJ4FxwOPu128AyoEXgW647jUc8jLwIK5v3m8CXwB/quW9D31Lr1LVD0TkI1zNN31VdaGItAUKVXU/sBjX/YSNuMII4A1cJ22A/xORG4AYoJ/7fSYAvwXmikgj9/EOBVFTXIHR3/1+LYEdwAPAE7ianC4BQt3vB9AaWH/cT8uYo4hNiGf8ibut/SDQDFiBq2mlDJgHXKCqK2vZJwhYBDzr3vdBXCf66qO2W+x+GI3rimMD8Bmuk3kvYArwpKrOPmKfjUBHVa089BjXzeH/uacgImGqetD9eDywWVWfdz//CvjzoXsWItIP+DcQh+uKvwCoADKA6cB5wExVTa3jR2cMYFcKxs+o6gH3wyIR+R2ub/4C/Km2QHDvUy0iv8B1Uq8Ezjo6ENzb9QEQkTHAWGA2rmad1UA7oPmRgXCEZOrQG+hQILiNAO494nmLI9/DfWUyFJgDDATOBTJUtcx9BfMJruYjY06K3VMw/mweruaWjsB3x9pIREJxndzLcAXIEPdrR25zh7sr6QpcJ+EduEJhJPAurnsJ845xiEwRaV3XokXkYiBYVbOPeDkF1/2DIzUHcoCvgFdwXb2A6+b5cODzuh7TmEMsFIxfEZEUEblMRN7H1Y1zBPAwrhu0H4rIL0RkoIiEi0gbEfk/XDea++C6OX02cBOQJyL/FJFLRCQB143kDFXtgavb6w5cIXKjqn4AdAWmHBkm7mapGFyBtPUY9YYctc/FuHo13el+HiMiQ4ADtXQtXQe8B4QDjwI9RGQsrl5T9+Ma3zDsVD5HE7jsnoLxGyKSjOsG77e4TpZTDvUyct+4vRxXs09LXD2N3gM+BZ5T1flHvddQ4GZcPX4GqOp2d3fQz3DdyP0Zrm6ulUeVsV1Vz3e/xxDgGVw3rZ+sZVtw3Rh+X1WfFJHn3ce7UVUXut/jAeBGYLyqvnVEfZG4gmox8LSqbhOR6911jVPVNSKSjissLlHVfXX6EE3As1AwfkVEROvwj9p9go862e6aInImrh5Ga+u4faS7N1Jdto3GdUVQcTI1GVOfLBSMMcbUsHsKxhhjalgoGGOMqeHT4xTi4+O1bdu2TpdhjDE+ZeHChTtUNaG2n/l0KLRt25acnJwTb2iMMaaGiOQd62fWfGSMMaaGhYIxxpgaFgrGGGNqWCgYY4ypYaFgjDGmhoWCMcaYGhYKxhhjalgoGNZsL+W5b9ewaVed5m0zxvgxCwXDC5nreP67taT/dTr3TV7CukJb592YQOXTI5rN6ausqmbGmiJGd0uiddNI3pmfx0eLNnFu92TGjexAr5ZxTpdoHKSqLC7YTc8WsYQG23fIQGChEOAWFexmT1kFl57RgvN7pXDXyA785/uNvPn9Rr5asY1hneIZl96RQe2b4lqCwASSt+bm8bvPVtA1OZo/XZpKvzZNnC7JeJhFf4DLyi0kJEgY1jkegGZR4dx3ThfmPDSKh8Z0ZdXWUq55NZvLXv6eaSu3Y+tvBI7Nu8sY/1UuvVrGsqesgsv/9T2PfLyMPfttDSB/ZqEQ4DJzC0lr24SYiJ+sU090RCh3jOjA7AdH8sdLelJYWs6tb+Uw5vlZfLp4M5VV1Q5VbBqCqvLox8tQ4MVr+/Lt/43g52e24735+Zz17HQ+XbzZviD4KQuFALZldxm520oZ1TXxmNtEhAZzw6A2ZN2fznNX9aaqWrn3vcWMemYG78zLp7yyqgErNg3lk8Wbmb66iPvP6UKrppFEhYfw2wu689ndQ2kR14h731vMja/PZ+MOW/rZ31goBLCs1YUAxw2FQ0KDg7j0jJZ8/avhTLihH00ah/HIx8sY9nQWr87cwL7y2takN75o595ynvh8JX1axXHTkLY/+VnPFrF8NO5Mnri4B4vyd3PO32fyj+/W2pcDP2KhEMCycgtp2aQRHRKi6rxPUJBwTo9kPhk3hLdvHUinpCj+NGUVQ/6SyXPfrmHXvoMerNg0hD98vpK95ZWMv7wXwUH/27kgOEi4cXBbvrtvBGd3S+LZb9eQ8fwssjfsdKBaU98sFALUgYoq5qzbyaiuiafUq0hEOLNjPG/fOohP7jqTge2a8vx3aznz6Uye/GIl2/Yc8EDVxtMyc7fz2ZItjEvvSOek6ONumxQTwYvX9eWNm/tTXlnN1ROyuW/yEorti4FPs1AIUPN+LKasooqRdWg6OpE+reKYcGMa3/x6OOf2SOaN7zcyfHwWD3+01NqcfUjpgQoe/Xg5nRKjGDeyQ533G9klkW9/PYJx6R34dPFmRj0znckLCuxGtI+yUAhQWbmFRIQGMbh9s3p7z85J0Tx3VR+m35/Olf1b8uEPrhPEL99dxKqtJfV2HOMZ479azbaSA/zlsl6EhwSf1L6NwoJ54LyuTLl3GJ0So3jgw6Vc9Uo2a7fb6HhfY6EQgFSVzNxCzuwQT0Toyf3PXxetmkby5CWpzH5wJL8Y3p7vVm1nzPOzuOU/C1iYV1zvxzOnb8HGYiZm53HT4LanNUCtc1I0/71tME9flsrq7aVk/GMWf/06lwMVdiPaV1goBKD1RfvIL95fL01Hx5MYHcHDY7rx/UNncd/ZnfkhfxeXvTyXq16Zy4w1Rda84CUOVFTx4IdLaRHXiN+c2+W03y8oSLiqf2u+u28EF/ZqzotZ6znnuZnMWFNUD9UaT7NQCEBZua6uqJ4OhUNiI0O556xOzHloFI9f0J28nfu56fX5XPjCbKYu20p1tYWDk17IXMeGon08NTaVxuH1N/NNfFQ4z17Vh3duHUhIkHDT6/O5591FFJZaJwRvZqEQgDJzC+mSFE2LuEYNetzIsBB+PrQdMx8YyfjLerGvvIo73/6B0c/N4P2cAipslHSDW7W1hH/NWM/Yvi0Y3jnBI8cY0jGeqb8axq9Gd+Lr5ds465kZTMzOsy8DXspCIcCUHqhgwcbiBrtKqE1YSBBX9m/FtP8bwQvXnkFESDC/+WApI8Zn8d8F+das1EAqq6p58MOlxDYK5bfnd/foscJDgvnV6M589athpLaI5befLGfsy9+zcot1QPA2FgoBZvbaHVRWa51GMXtacJBwQa/mfPnLobxxc39S4hrx4IfLuHPSDzbpWgN4Y85Glm7aw+8v6kGTxmENcsz2CVG8fetAnruqNwXF+7nwhdn86cuVNiLei1goBJjM3EJiIkLo2zrO6VJqiAgjuyTy/u2DeTSjG9NWbSfjH7Osp5IH5e3cxzPfrmZ0t0Qu6JXSoMcWES49oyXf3TeCK9Na8uqsHzn72Rl8s2Jbg9ZhauexUBCR10Rkrog8doyfNxGRKSKSIyKv1HU/c+qqq5Ws1UUM75xAiBcumBIUJPxieHs+vHMIwUHCla9k82LWOmt7rmeqysMfLSMkKIg/XtLTsXUy4iLDeGpsLz64YzDREaHcNnEhv3grhy27yxypx7h45MwgImOBYFUdDLQXkU61bHYD8LaqpgHRIpJWx/3MKVq+ZQ879pZ7RdPR8fRuFccXvxzKmJ7J/PXr1dz4+nzrsVKPJucU8P36nTw0pispsQ3b2aA2aW2b8sUvh/LgeV2ZtbaI0c/O4N+zNtj07A7x1NfFdGCy+/E3wNBattkJ9BSROKAVUFDH/cwpyswtRARGeKiXSX2KiQjln9ecwdOXpZKTV0zG87Osn3s9KCw5wJNfrmJAu6ZcO6C10+XUCA0O4s70Dnz76xEMbNeUJ79cxUUvzGFxwW6nSws4ngqFxsBm9+NiIKmWbWYDbYBfAqvc251wPxG5zd3klFNUZCeJk5G1uog+reJoFhXudCl1IuIaBPX53UNp1jicm16fz1NTV1nX1dPw+KcrKK+s5i9jUwmqZQZUp7VqGsnrP+vPS9f1Zcfeci59aQ6Pf7qckgPW8aCheCoU9gKHrkujjnGc3wF3qOoTQC5wc132U9UJqpqmqmkJCd7/jddb7NhbztJNuxnVxbubjmrTKSmaT+8+k+sGtuaVGRu44l9zKSje73RZPuer5Vv5asU27j2rE+1PYrr0hiYiZKSm8N19I7hpcFsmZucx+pkZTFm21enSAoKnQmEhh5t+egMba9mmCZAqIsHAQEDruJ85BdNXF6HacKOY61tEaDB/ujSVl67ry/qivWQ8P4svl9pJoq727K/gt5+uoHtKDLcNb+90OXUSHRHK7y/qwad3nUliTDjj3v6Bidl5Tpfl9zwVCp8AN4jIs8CVwAoRefKobZ4CJgB7gKbAu7Xs96WH6gs4WbmFJEaH06N5jNOlnJaM1BSm/HIYHZOiuOudH3j4o2WUHbTJ1k7kz1NWsXNvOU9f1otQL+x5djy9Wsbx8bgzGd0tkcc/Xc4nizafeCdzyjzyr0NVS3DdNM4GRqrqElV97Kht5qtqD1WNUtWzVXVvLfvt8UR9gaaiqpqZa4oY2eXUFtTxNq2aRjL59sHcmd6B9xbkc/GLs1ljUzQf0/frdvDfnAJ+Mbw9qS1jnS7nlIQGB/HCtX0Z2K4p972/hGkrtztdkt/y2FcGVd2lqpNV9aRGpJzqfubYFubtorS80mebjmoTGhzEg+d15a2fD6B430EuemE27863KTKOVnawioc+WkbbZpH8enRnp8s5LRGhwfz7pv70bB7DuHd+YO56W/7TE3zrOtKckqzcQkKDhaGd4p0upd4N65TAlHuH0b9tUx7+aBl3v7vIeqoc4blpa8gv3s9TY3t5ZO2MhhYVHsJ/bh5Am6aR3PrmApZYl9V6Z6EQADJzCxnYrhlR9TgtsjdJjI7gzZsH8OB5Xflq+TYynp/FovxdTpfluKWbdvPvWRu4ZkArBneovxX2nNakcRiTbh1I06gwbnpjvjUd1jMLBT9XULyftYV7Se/i3913g4KEO9M7MPn2wajCFf+ayysz1gfsFBkVVdU88MFS4qPCeWhMN6fLqXdJMRG8fcsgwoKDuP7f88jfaV2U64uFgp/LWu1aUMfbp7aoL/3aNGHKvcM4p0cST03N5Wf/WUBRabnTZTW4CTM3kLutlD9e0pPYRqFOl+MRrZtFMvGWgRysqub61+axvcSmQqkPFgp+LjO3kLbNIr16sFJ9i20UyovX9uVPl/Zk3oadZPxjFrPX7nC6rAazrnAvz09bS0ZqMuf2SHa6HI/qkhzNf24ewM695dzw2jx27TvodEk+z0LBj5UdrGLu+p1+1euorkSE6wa24dO7zyS2USg3vD6Pv36d6/dTZFRXKw9/tJRGYcH8/qIeTpfTIPq0iuPVm9LYuHM/P3tjPnttbYbTYqHgx+Zu2EF5ZXXANB3VpmtyDJ/fPZSr+7fixaz1XD0hm027/Lf9+e15eSzYuItHz+9GYnSE0+U0mCEd4nnx2r4s31LCL97M4UCFDWg8VRYKfiwzt5DIsGAGtGvqdCmOahQWzFNje/HPa85gzbZSMp6fxVfL/W+KjC27y/jL1FyGdoznin4tnS6nwZ3dPYlnruhN9o87ufudRX5/VegpFgp+SlXJyi3izI7xhIf4fv/0+nBh7+Z8+cthtItvzB2TfuCxT5b5zTdKVeWxT5ZTrfDnS1P9YuT6qbjkjBY8cVEPpq3azgMfLA3Y3menw0LBT63ZvpfNu8sCuumoNq2bRfL+HUO4bXh7JmXnc8mLc1hX6Pv93D9bsoXM3ELuO6czrZtFOl2Oo24Y3JbfnNuFjxdt5vefr7BR7ifJQsFPZea6uqKO9MGpsj0tLCSIRzK68cbN/SkqLefCf85hck6Bz548ivcd5A+fr6R3y1huPrOd0+V4hXHpHbh9eHvempvHM9+scbocn2Kh4KeyVhfSPSWG5NjAudl4skZ2SWTqvcM4o3UcD3ywlHvfW0ypD06R8ccvVlJSVsHTl/ci2AsXznGCiPDQmK5cM6AVL2St45UZ650uyWdYKPihPfsrWJi3y5qO6iAxJoKJtwzk/nM68+WyrVzwz9ks3bTb6bLqbPrqQj5etJlx6R3omuzb06LXNxHhyUtSOb9XCk9NzeXd+flOl+QTLBT80My1RVRVa0COTzgVwUHC3aM68d/bBlFRWc1lL3/PU1NWef3qbnvLK3n04+V0TIzirlEdnS7HKwUHCc9d2Yf0Lgk88vEyPl+yxemSvJ6Fgh/Kyi2kSWQofVrFOV2KT0lr25Qp9w7j/NQUXp21geF/zeLmN+bz3artVHlhL5a/fb2aLXvKePqyVOthdhxhIUG8fF0/+rdpyq//u5gs9/02UzsLBT9TVa1MX1PEiM4J1r58CuIiw/j71Wcw56FR3DOqEyu2lHDLmzkMH5/FC5lrKSz1jvl1Fubt4s25G7lxUBv6tQnscSh10SgsmH//LI0uydHcMWkh838sdrokr2Wh4GeWbNpN8b6D1nR0mlJiG/F/Z3dmzkOjePm6vrSNj+Rv36xhyFOZ3OVe4MWp3krllVU8+OFSUmIi+M15XR2pwRfFRITy1s8H0LJJI275zwKWb7aFHWtjoeBnpucWEiQworN/T5XdUEKDgxiTmsLbtw4i874R3DSkLbPX7uCaV7M5+7mZvDHnR/aUNWyPpRez1rOucC9/Gpvqt2tkeEqzqHAm3TqQmEah3Pj6fNYV7nW6JK9joeBnMlcX0q9NE+Iiw5wuxe+0T4jitxd0Z94jZ/G3K3oTFR7CHz5fycA/T+OBD5Y0SK+l3G0lvJS1jkv6NLcxKKcoJbYRk24dSJAIN7w2z6/nwjoVFgp+pLDkAMs3l5BuJwuPiggN5vJ+LfnkrjP54p6hXHpGCz5fspWLXpjDRS/MZvKCAsoO1v/0GVXVyoMfLiOmUSiPXxgYM6B6Srv4xky8ZQD7yiu5/t/zAnLNjWOxUPAjgbagjjfo2SKWp8b2Yt6jZ/GHi3pQdrCKBz5cysA/T+MPn6+o1+aJN+b8yJKC3fzuwu40bWxXgqerW0oMb9w8gO0lrrUY9uz3vYGLnmCh4EcycwtJiY2ga3K006UEnJiIUG4a0pZvfj2cybcPJr1LIpOy8xj97AyunjCXL5Zu4WDlqc/aWVC8n2e+WcPILglc1Lt5PVYe2Pq1acKEG/uxoWgfN/9nPvsP2loMFgp+oryyitlrdzCya2LAzpDpDUSEAe2a8o9rzmDuw2fxwHld2LSrjLvfWcSQv2Tyt69Xs3l32Um9p6ry8EfLCBJ4MoBnQPWUYZ0S+Mc1fVhcsJvbJy6kvNI/Zs49VRYKfiJn4y72HaxilN1P8BrxUeGMS+/IjN+M5I2f9ad3y1henL6OYU9ncuubC8haXVinQXEfLNzE7HU7eHBMV1rENWqAygPPeT1TePqyXsxau4N7311MZQCvxWD92fxEZm4hYSFBDOnYzOlSzFGCg4SRXRMZ2TWRTbv28978At5bUMC0VQto2aQR1w5szZVprYiPCv+ffYtKy3nyy1WktWnC9QPbOFB94LgirRWlByp54ouVPPTRMsZf1ougABwAaqHgJ7JyCxnUvhmRYfaf1Ju1bBLJ/ed24ZdndeKblduYlJ3H+K9W89y3axjTM4XrB7Whf9smNU1Ev/9sBWUHq/hLgJ6gGtrPh7aj5EAFf5+2luiIEB6/oHvANdd57AwiIq8B3YEvVfXJWn5+J3CV+2kcMA+4C9jg/gNwj6ou81SN/mLjjn1s2LGPGwfbN0lfERYSxAW9mnNBr+asKyxlUnY+H/6wic+WbKFzUhTXD2pDdEQIXy7byv3ndKZjYpTTJQeMe8/qRElZJa/P+ZHYRqH8anRnp0tqUB4JBREZCwSr6mAReV1EOqnq2iO3UdWXgZfd2/8TeBPoBbyrqg96oi5/dWhBnVFdkxyuxJyKjonR/P6iHjxwXhc+X7KFSdn5PP7pCgC6Jkdz+4gODlcYWESEx87vdsQVQyi3DA2cxYs8daWQDkx2P/4GGAqsrW1DEWkBJKlqjoiMAy4QkZHAMuB2VbU+YieQtbqQDgmNA34ZRl8XGRbCVf1bc1X/1izdtJvPl2zhyrRWhAZbf5CGFhQk/GVsKnsPVPLHL1YSHRHClWmtnC6rQXjqX1tjYLP7cTFwvK+wd+G+YgAWAKNVdQAQCmQcvbGI3CYiOSKSU1RUVI8l+6Z95ZXM21BsA9b8TK+WcTx6fnc6JdmYE6eEBAfx/DV9GNYpnoc+XMpXy7c6XVKD8FQo7AUO9Z2LOtZxRCQIGAlMd7+0VFUPffI5QKej91HVCaqapqppCQk26ducdTs4WFVt8+AY4wHhIcG8ckM/+rSK4553FzFzjf9/EfVUKCzE1WQE0BvYeIzthgHz9PAcxBNFpLeIBAOXAEs8VJ/fyFpdSFR4CGltbU59YzwhMiyEN342gA4JUdw+cSEL8/x7LQZPhcInwA0i8ixwJbBCRP6nBxJwLjDziOdPABOBxcBcVZ3mofr8gqqSlVvEsE7xhIVYu7MxnhIbGcrEWwaSHBvBuLd/8MqV+OqLR84kqlqC62ZzNjBSVZeo6mO1bPeIqn50xPPlqtpLVVNV9VFP1OZPVm4tYVvJAVtQx5gGkBAdzv3ndGF7Sblfr9zmsa+XqrpLVSer6jZPHSPQHVprNr2L3VsxpiGM7JpARGgQU/34prO1OfiwrNVF9GoZS2J0hNOlGBMQIsNCGNklkanLt/ltE5KFgo/ate8gi/J32YI6xjSwMakpFJWWszBvl9OleISFgo+asaaIarUFdYxpaGd1TSQ8JIgpy/yzCclCwUdl5hYSHxVGrxaxTpdiTEBpHB5CepcEpi7fSrUfNiFZKPigyqpqZqwpYkTnRJs50xgHZKSmsL2knB/y/a8JyULBBy0q2M2esgprOjLGIaO6JhIWEsSUZf7XudJCwQdl5RYSHCQM6xzvdCnGBKToiFCGd/LPJiQLBR+UmVtIWpsmxESEOl2KMQHr/F7JbN1zgEUFu50upV5ZKPiYLbvLyN1Wak1HxjjsrG5JhAUHMdXPeiFZKPiYrNWHFtSxUDDGSTERoQzrFM/U5ds4PKen77NQ8DFZuYW0bNLIlmc0xguMSU1h8+4ylmza43Qp9cZCwYccqKhizrqdjOqaGHCLiRvjjc7ulkRosPjVQDYLBR8y78diyiqqbEEdY7xEbGQoZ3aMZ8qyrX7ThGSh4EOycguJCA1icIdmTpdijHHLSE1h064ylm32jyYkCwUfoapk5hYypEM8EaHBTpdjjHE7p3sSIUHiNwPZLBR8xPqifeQX77cFdYzxMnGRYQzxoyYkCwUfcWhBHeuKaoz3OT81mfzi/azYUuJ0KafNQsFHZOYW0iUpmhZxjZwuxRhzlLO7JxMc5B+9kCwUfEDpgQoWbCwmvastu2mMN2raOIwhHZr5RROShYIPmL12B5XVyijrimqM1xrTM4WNO/ezamup06WcFgsFH5CZW0hMRAj92jRxuhRjzDGc2yOJIMHnm5AsFLxcdbWStbqI4Z0TCAm2/1zGeKtmUeEMau/7TUh2lvFyy7fsYcfecut1ZIwPyEhNYcOOfaze7rtNSBYKXi4ztxARGNHZbjIb4+3O7ZHsbkLy3YFsFgpeLmt1Eb1bxtEsKtzpUowxJ5AQHc6Adk19+r6ChYIX27G3nKWbdlvTkTE+5PzUFNYV7mWtjzYheSwUROQ1EZkrIo8d4+d3ish095/FIvJKXfYLJNNXF6Fqo5iN8SXn9kxGBL700asFj4SCiIwFglV1MNBeRDodvY2qvqyq6aqaDswCXq3LfoEkK7eQxOhwejSPcboUY0wdJUZH0L+t7zYheepKIR2Y7H78DTD0WBuKSAsgSVVzTmY/f1dRVc3MNUWM7GIL6hjjazJ6JrNm+17WFfpeE9IJQ0Fc0o7xs3bH2K0xsNn9uBhIOs4h7gJerut+InKbiOSISE5RUdGJyvdZORt3UVpeyUib2sIYnzMmNQXwzV5Idb1S+FREnhWRu0WkP4CI9APeOcb2e4FDM7dFHes4IhIEjASm13U/VZ2gqmmqmpaQ4L8nzOmrCwkNFoZ28t/f0Rh/lRQTQVqbJj7ZhHTcUBARUdfQvHXAK8AaYIyI/AC8AFxxjF0Xcrjppzew8RjbDQPm6eHhf3Xdz+9l5hYyoF1TosJDnC7FGHMKMlJTyN1WyoaivU6XclJOdKUwVUQ+AGKBjsAgIA34DNgEHOtr7CfADSLyLHAlsEJEnqxlu3OBmcfZ78u6/Rr+paB4P2sL99pazMb4sDGpyQBMXe5bTUgn+hp6OdAGuBt4AtgKXKyqVSLSFnhdRM7Soyb6UNUSEUkHzgbGq+o2YMnRb66qj5xgP/9Y9PQkZa22BXWM8XUpsY3o2zqOL5du5a6RHZ0up85OFArjgE7ADmAp8HfgRxF5G+gJPHh0IByiqrs43JOozk51P3+SmVtI22aRtE+IcroUY8xpyEhN4ckvV7Fxxz7axjd2upw6OVHzUQygwBAgDFeILAEWA22BFR6sLSCVHaxi7vqdpFvTkTE+r6YX0nLfueF8olCYBvwInAGsBi7FdQP4PGA88MixdzWnYu6GHZRXVlvTkTF+oEVcI/q0ivOpXkgnCoWRwEFcPY26ABNx9UTKVtWJQAd3t1JTTzJzC4kMC2Zg+6ZOl2KMqQcZqcks31xC/s79TpdSJ8c9oavq74B/4QqFl4F44DFVfcW9yZ2qWu3ZEgOHqpKVW8SZHeMJDwl2uhxjTD0Y09O3mpBO+C1fVfcBhcDfgPaq+v0RP9vtudICz5rte9m8u8yajozxI62aRtKrZSxTfaQJqS7TXIQB7wIzgLtF5H336OZfu7ulmnqSmevqiprexUYxG+NPMlJTWLJpDwXF3t+EdKIRzecAs4GZqvogIMB9uLqM7gTe8niFASQrt5BuKTGkxDY68cbGGJ+R4W5C+soHBrKd6EpBgAtU9Z/u55Wqmq+q2ar6Fq7eSaYe7NlfwcL8XYyyCfCM8Tutm0XSs0WMT6yxcKJQmKWqhUc8by8ijx2aFE9Vn/BcaYFl5toiqqrV7icY46fG9ExhccFuNu8uc7qU4zpRKFwhIgtEZLT7+Q5gPfCQiLwnIjZbWz3Jyi2kSWQofVo1cboUY4wHZLgHsnn7DecTdUl9E9f8R/eIyH+Aqar6rqpeBnwPvOT5Ev1fVbUyfU0RIzonEBxkC+oY44/axTemW0qM1w9kq0uX1DxVvRjX9Badj3j9H0C8iNhd0dO0ZNNuivcdZKQ1HRnj185PTeaH/N1s3eO9TUh1Ho2sqs8B9xz12lhV9d7fzkdMzy0kSGBEZ7vJbIw/O9yE5L29kE5qigpVzfdUIYEsc3UhfVs3IS4yzOlSjDEe1D4hiq7J0Uz14tHNNm+RwwpLDrB8c4k1HRkTIDJSU8jJ28X2kgNOl1IrCwWH2YI6xgSWjNRkVL13IJuFgsMycwtJiY2ga3K006UYYxpAx8RoOidFee1ANgsFB5VXVjF77Q7SuyQiYl1RjQkUY3qmsGBjMYWl3teEZKHgoHkbitl3sMqajowJMOf3SkEVvvbCJiQLBQf9d0EBsY1CGdYp3ulSjDENqFNiFB0SGntlE5KFgkMKSw7w9YptXJnWkohQW1DHmEAiIpyfmsL8H4spKi13upyfsFBwyHsLCqisVq4b2MbpUowxDsjolUK1wtcrvKsJyULBAZVV1bwzL59hneJpG9/Y6XKMMQ7okhRN+/jGXjeQzULBAdNWFbKt5AA3DLKrBGMClYiQkZrC3PU72bnXe5qQLBQc8Pa8PFJiI6zXkTEBbkxqMtUK36zc7nQpNSwUGtiGor3MWruDawe0JiTYPn5jAln3lBjaNov0qum0PXZWEpHXRGSuiDx2gu1eEpEL3Y9DRCRfRKa7/6R6qj6nvD0vn5Ag4aoBrZwuxRjjMBFhTGoK36/fya59B50uB/BQKIjIWCBYVQfjWsKz0zG2GwYkq+rn7pd6Ae+qarr7zzJP1OeUsoNVfLBwE+f2TCYxOsLpcowxXuD81BSqqpVvVnpHLyRPXSmkA5Pdj78Bhh69gYiEAq8CG0XkYvfLg4ALRGS++0rDr5b7/HzpFvaUVdgNZmNMjR7NY2jVtBFfeskaC54KhcbAZvfjYiCplm1uBFYC44EBInIPsAAYraoDgFAg4+idROQ2EckRkZyioiKPFO8pb2fn0SkxioHtmjpdijHGSxzqhfT9uh3s3u98E5KnQmEvcGiZzqhjHOcMYIKqbgMmASOBpap66I5LDvA/zU6qOkFV01Q1LSHBd1YqW1KwmyWb9nD9oDY2+Z0x5icyeqZQWa1e0QvJU6GwkMNNRr2BjbVssw5o736cBuQBE0Wkt4gEA5fgWhfaL0zKziMyLJhL+7ZwuhRjjJfp1TKWlk0aMdULeiF5qs3+E2CWiDQHxgBXi8iTqnpkT6TXgNdF5GpcTUWXA02AdwABPlPVaR6qr0Ht2V/BZ0u2MLZvS2IiQp0uxxjjZQ41Ib0x50f2lFUQ28i584RHQkFVS0QkHTgbGO9uIlpy1DalwBVH7boZVw8kv/L+wgLKK6u5flBrp0sxxnipMT2TmTBzA9NWbueyfi0dq8Nj4xRUdZeqTnYHQsCqrlbenpdPvzZN6NE81ulyjDFeqk+rOJrHRjg+kM2G1HrY9+t38uOOfXaVYIw5rkMD2Wat3UHJgQrH6rBQ8LCJ2Rtp2jiMMT1TnC7FGOPlMlJTOFhVzXernOuFZKHgQVv3lDFtVSFX2EI6xpg6OKNVHMkxEXy51LlWdwsFD3p3fgHVqlw3wEYwG2NOLChIGJOazMy1RZQ61IRkoeAhFVXVvDc/n/TOCbRuFul0OcYYH5GRmsLBymoycwsdOb6Fgod8u3I7haXlXG/zHBljTkK/1k1IjA53rBeShYKHTJybR4u4RqR3sYV0jDF1FxQkjOmZzPTVRewrr2z44zf4EQPAusJS5m7YyXWDWhMcZPMcGWNOTkZqCuUONSFZKHjApOx8QoOFK9NsIR1jzMlLa9uUBIeakCwU6tn+g5V8uHATGakpxEeFO12OMcYHBQcJ5/VIJmt1IfsPNmwTkoVCPfts8RZKyyvtBrMx5rRkpKZwoKKarNyGXTfGQqEeqSpvzc2ja3I0aW2aOF2OMcaHDWjXlPiosAZvQrJQqEeLCnazcmuJLaRjjDltwUHCuT2SycwtpOxgVYMd10KhHk3KzqNxWDCXnGEL6RhjTl9GagplFVVMX91wvZAsFOrJrn0H+WLpVsb2bUlUuKfWLjLGBJKB7ZrStHEYU5Y33FxIFgr15P2FBRysrLYbzMaYehMSHMS5PZL4btV2DlQ0TBOShUI9qK5WJmXnM6BtU7okRztdjjHGj2SkprD/YBUz1jRMLyQLhXowc20R+cX7uX6wXSUYY+rXoPbNiIsMbbBeSBYK9WBSdj7xUWGc1yPZ6VKMMX4mNDiIc7sn892qwgZpQrJQOE2bd5eRmbudq/q3IizEPk5jTP3L6JXC3vJKZq3d4fFj2VnsNL07Lx+AawbYGszGGM8Y0qEZsY0apgnJQuE0HKys5r0F+YzqmkjLJraQjjHGM0KDgzinexLTVm6nvNKzTUgWCqfhqxXb2LH3oHVDNcZ4XEZqCqXllcz2cBOShcJpmJSdR+umkQzvlOB0KcYYP3dmx3iiI0KYssyzA9ksFE7R6m2lzP+xmOsGtibIFtIxxnhYWEgQZ3dP4tuV2zhYWe2x41gonKJJ2XmEhQRxhS2kY4xpIOenplByoJI56z3XhOSxUBCR10Rkrog8doLtXhKRC092PyftLa/k40WbuSA1haaNw5wuxxgTIIZ2iic6PIQpSz3XC8kjoSAiY4FgVR0MtBeRTsfYbhiQrKqfn8x+Tvtk0Wb2llfaCGZjTIMKDwlmdPckvlm5nYoqzzQheepKIR2Y7H78DTD06A1EJBR4FdgoIhfXdT+nqSqTsvPo0TyGM1rFOV2OMSbAjOmZzJ6yCr5fv9Mj7++pUGgMbHY/LgaSatnmRmAlMB4YICL31GU/EblNRHJEJKeoqGGXqQNYmLeL3G2ltpCOMcYRwzsnEOXBJiRPhcJeoJH7cdQxjnMGMEFVtwGTgJF12U9VJ6hqmqqmJSQ0fFfQidl5RIeHcHGf5g1+bGOMiQgN5sq0ViTGhHvk/T21GsxCXE0/2UBvYHUt26wD2rsfpwF5wKI67OeYHXvLmbpsG9cObE1kmC2kY4xxxuMXdvfYe3vqzPYJMEtEmgNjgKtF5ElVPbJH0WvA6yJyNRAKXA6UHrXfIA/Vd0om5xRwsKqa6wfZPEfGGP/kkVBQ1RIRSQfOBsa7m4iWHLVNKXDF0fsetd8eT9R3KqqqlXfm5TO4fTM6JtpCOsYY/+SxNhBV3cXhnkQe38/TZqwpZNOuMh4e083pUowxxmNsRHMdTZybR0J0OOf0qK0jlTHG+AcLhTooKN7P9DVFXDOgNaHB9pEZY/yXneHq4O15+QSJcM0Am+fIGOPfLBROoLyyisk5BYzulkhKbKMT72CMMT7MQuEEpi7bRvE+W0jHGBMYLBROYGJ2Hu3iG3Nmh3inSzHGGI+zUDiOlVtKWJi3yxbSMcYEDAuF45g0L4/wkCAu79fS6VKMMaZBWCgcQ+mBCj5ZtJmLejcnLtIW0jHGBAYLhWP4eNFm9h+s4gZbSMcYE0AsFGqhqkycm0evlrH0ahnndDnGGNNgLBRqMf/HYtYW7rVuqMaYgGOhUIuJ2XnERIRwYS9bSMcYE1gsFI5SWHqAr5Zv44q0VjQKC3a6HGOMaVAWCkeZvKCAymrluoG2kI4xJvBYKByhsqqad+blM7RjPO0TopwuxxhjGpyFwhEycwvZsueA3WA2xgQsC4UjTJqXT3JMBKO7JTpdijHGOMJCwW3jjn3MdC+kE2IL6RhjApSd/dzemZ9PSJBwtS2kY4wJYBYKwIEK10I65/RIIikmwulyjDHGMRYKwBdLt7J7f4XdYDbGBDwLBWBSdh4dEhozuH0zp0sxxhhHBXwoLN+8h8UFu7l+UBtEbCEdY0xgC/hQmJSdR6PQYMb2tYV0jDEmoENhT1kFnyzezMV9mhPbKNTpcowxxnEeCwUReU1E5orIY8f4eYiI5IvIdPef1Npe81R9AB8u3MSBimq7wWyMMW4hnnhTERkLBKvqYBF5XUQ6qeraozbrBbyrqg8esV/fo1/zFFVl0rw8zmgdR88WsZ4+nDHG+ARPXSmkA5Pdj78BhtayzSDgAhGZ776qCDnGax4xd/1ONhTt4/qBdpVgjDGHeCoUGgOb3Y+LgaRatlkAjFbVAUAokHGM135CRG4TkRwRySkqKjrlAidm5xEXGcr5vVJO+T2MMcbfeCoU9gKN3I+jjnGcpaq61f04B+h0jNd+QlUnqGqaqqYlJCScUnHbSw7wzcrtXJXWiohQW0jHGGMO8VQoLORwk1FvYGMt20wUkd4iEgxcAiw5xmsecf3A1lxrC+kYY8xPeKrN/hNglog0B8YAV4vIk6p6ZE+kJ4B3AAE+U9VpIrLt6Nc8UVxSTAR/uLinJ97aGGN8mkdCQVVLRCQdOBsYr6rbOOpbv6oux9UD6bivGWOMaTge692jqrs43APJGGOMDwjoEc3GGGN+ykLBGGNMDQsFY4wxNSwUjDHG1LBQMMYYU8NCwRhjTA1RVadrOGUiUgTkOV3HaYoHdjhdhBexz+On7PM4zD6Lnzqdz6ONqtY6T5BPh4I/EJEcVU1zug5vYZ/HT9nncZh9Fj/lqc/Dmo+MMcbUsFAwxhhTw0LBeROcLsDL2OfxU/Z5HGafxU955POwewrGGGNq2JWCMcaYGhYKDhGRWBGZKiLfiMjHIhLmdE3eQESSRGSR03V4CxF5SUQudLoOJ4lIExGZ4l6G9xWn6/F3FgrOuQ54VlXPAbYB5zlcj7f4G4eXcg1oIjIMSFbVz52uxWE3AG+7u19Gi0jAdkt1f2madcTz10Rkrog8drz9ToaFgkNU9SVV/db9NAEodLIebyAio4B9uEIyoIlIKPAqsFFELna6HoftBHqKSBzQCihwthxniEgT4E2gsfv5WCBYVQcD7UXkf9a0PxUWCg4TkcFAE1XNdroWJ7mbz34LPOR0LV7iRmAlMB4YICL3OFyPk2YDbYBfAquAYmfLcUwVcBVQ4n6ezuGFzL4BhtbHQSwUHCQiTYF/Aj93uhYv8BDwkqrudroQL3EGMMG9lO0kYKTD9Tjpd8AdqvoEkAvc7HA9jlDVElXdc8RLjYHN7sfFQFJ9HMdCwSHub8bvAw+rqq/P31QfRgN3ich0oI+I/Nvhepy2DmjvfpyG78/xdTqaAKkiEgwMBKwfvcteDt9/i6KezucWCs65BegLPCoi00XkKqcLcpKqDlfVdFVNBxar6q1O1+Sw14CRIjITGIfrBnygegrXQK09QFPgXWfL8RoLOdxk1BvYWB9vaoPXjDHGh4jIdFVNF5EYYBbwHTAGGHRU89Kpvb+FgjHG+CZ3j6SzgZnu+0+n/54WCsYYYw6xewrGGGNqWCgYY4ypEeJ0Acb4KhGZr6oDRCQBOBPXaNueAKp6u4g8AWTh6m5bCrwIfABkqGqVQ2Ubc1wWCsacun3uv/sDlwN/xzX2ZLuIROEaeToYSASScY3K3aeqVSISBKCq1Q1dtDHHY81HxpwkERksIp8A3UXkCyAGWKeqOaq6TV29N2KBZsDDQFdcC6zfDXR0jz3YhGtQmjFexXofGXOKRGQacDGuq4FXgB9xXRXsAR4D7gBWA12Ag0Av4HFco5VvV9VfNXzVxhyfXSkYc5JEpLGInI/rCuA/QASueYpGA2WqOgxYD/wBCAWeBZ4DtgL9gNbABgdKN+aE7J6CMScvDdccPPmqeoWI3MT/Tn3eBngS6IRrCoI+QDvgI/fPpzZMqcacHLtSMOYkqeoMVX0c2O9+aSiuKZ3B/f+Uqs7BNa3xd7hmOX1bVSuAH4BLgAUNWbMxdWWhYMwpEJFooLF7+vN+HD7JH3n1/S9cofAYrkVi2gE9gHJckyEa43Ws+ciYU/M28F9ci548f8S4g3ComZPmZVz3DgYB3YE3gPuB7cAHInKtqq5v6MKNOR7rfWSMh4hIiKpWuh8LEHQoPERE1P7nM17IQsEYY0wNu6dgjDGmhoWCMcaYGhYKxhhjalgoGGOMqWGhYIwxpsb/Az1j0ByyzlGkAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(1,11),cv_scores)\n",
    "plt.title('交叉验证分数')\n",
    "plt.xlabel('折数')\n",
    "plt.ylabel('分数')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "5fc85161",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测测试集\n",
    "y_pred = rfc.predict(X_test_filtered)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "6bcb885b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "测试集准确率: 0.673333\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        farm       0.64      0.74      0.68        53\n",
      "      forest       0.60      0.59      0.59        78\n",
      "       grass       0.39      0.58      0.47        36\n",
      "  impervious       0.86      0.80      0.83        40\n",
      "     orchard       0.79      0.57      0.67        47\n",
      "       water       1.00      0.80      0.89        46\n",
      "\n",
      "    accuracy                           0.67       300\n",
      "   macro avg       0.71      0.68      0.69       300\n",
      "weighted avg       0.71      0.67      0.68       300\n",
      "\n"
     ]
    }
   ],
   "source": [
    "test_accuracy = rfc.score(X_test_filtered, y_test)\n",
    "print(f\"\\n测试集准确率: {test_accuracy:.6f}\")\n",
    "# 输出详细滴分类报告\n",
    "print(classification_report(y_test, y_pred))    # 包含精确率、召回率、F1分数、支持度指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "3fd81139",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 混淆矩阵可视化\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d', cmap='Blues')\n",
    "plt.xlabel('预测类别')\n",
    "plt.ylabel('真实类别')\n",
    "plt.title('混淆矩阵')\n",
    "plt.tight_layout()  # 优化布局\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "6d63dc13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12, 5))\n",
    "plt.bar(final_features, rfc.feature_importances_, width=0.6)\n",
    "plt.xticks(rotation=90, ha='right')\n",
    "plt.title('特征重要性排序')\n",
    "plt.xlabel('特征名称')\n",
    "plt.ylabel('重要性得分')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "50539cee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vvAF3vKWt7Bnzx4uvfRS4vF4YWedL37xiyxevLhw7N577wW8EH7hhRceMb729nbuueceotEo5557LrfeeuthvcO9vb1MmDCBRx55hNdee42XXnqJ9vZ2otEofr8f13VxXfekv08iIiIi401FrmJxXB54AK69Fvr7vfvt7d59gKuuOuGnffOb38yECRMIh8O4rovjOPziF7/g9a9/PYFAgEwmwxNPPMGNN97IZZddxh/+8Acuv/xyfvGLX1BXV1d4no0bN3LnnXcyf/58LrnkEnp6evjpT3/KJZdcQjabPazi/JnPfIaPfOQjhfsdHR1cc801g1ayP/7xj/PlL38ZYwxNTU1cffXVXHXVVTz44IMEg0G6uro4cOAA9957LwsXLmTZsmXce++9vPzyy6xcuZKXX36Zhx56iCVLlpzw90hERERkPKr8gPzJT8KTTw798UcfhYF9v/398KEPwTe/OfhjFi6Er31tyKe87777+NWvfsWqVas4//zzC8eLJ7A9+OCDHDhwgNWrV/POd76TCy+8kNdee43ly5dz5513cvHFFwOwYMECHnzwQS699FLWrVtHKpXiwIEDrFu3jkwmw8yZMznzzDMHHYff7+fHP/4xl1122WHHv/rVrzJx4kTe8pa3FI594hOfYNeuXSxfvpxvfetbnHrqqWzbto1Pf/rTbNmyhb179/L0009zxx13MHv2bL7xjW8oHIuIiEhFqvyAfCxDTIob8vgwXHvttcybN4/f/e53ACQSCQKBw7/Vf/M3f8Nf/uVf8uUvf5kbb7yR3bt3c9lll/HII48QDAbJZrMEAgEikQjhcJiZM2eyatUqenp62L17N6tWrQIgnU4XnvOuu+7igQceYN68eXz9619nwoQJR4ytvb2dP/7xj7z+9a9nwYIF7N+/n9NOO63QV3zjjTfS19dHNpvlC1/4Avfffz833XQTwWCQz3/+82zatIlQKMTpp59+wt8fERERkfGs8gPyUSq9gNdz3N5+5PHmZmhtPalP7fN5Ld6vvPIK73rXuw77mDGGu+66i5tuuolnn32WZ599lqeeeopt27ZRX19PfX09P//5z6mrq6OmpoZ3vvOdLFiwgLVr17J69WoWLFgAcNiOdQNbLAbT3NzMr371KwAWLVrEyy+/zG233UZ7ezs33XQT11xzDQAPP/wwt956Ky+99BJPPfUUTz75JFu3bmX16tUAhQq3iIiISKWp/IB8LHfccXgPMkBtrXf8JHV1dfHHP/6RF198kTlz5hz2sS1btrBlyxa+//3v8+Y3v5lvf/vb/OIXv6C3t5eGhgaCwSB1dXU8++yz3HDDDfh8Pv7lX/6Fzs5O/H4/3/nOdzjttNPIZDLcc889JzS+n/zkJ9x8880A7N69m5kzZxY+tnz5cq644goeffRRLr74YubPn08wGOS8887joYce4rbbbjvxb4yIiIhITsbJABD0B49x5thRQM5PxLvlFti+HWbN8sLxSUzQA2894+9+97tMmTKF+fPnA5DJeP8ArLXMnDmTL3/5y/z+97/nt7/9Ld/85jf5u7/7Ox577DGmT5/OV77yFc455xzOOuss7r//fh588EGefPJJ4vE4xhieffZZEokE733veznzzDP55S9/eVzju/vuuwkEAlxwwQUAvPjii4cFZIDrrruOaDTK7bffTnNzM1u3bmXz5s2Ew2Eef/xxFi9efFLfIxEREalOGSdDf6afzmQniUyCiZGJTKmfUuphFSgggxeGTzIQD7R//37uvPNOnnjiCb7whS8A8LWvfa2wqsW6det46qmn+MAHPsCGDRu49NJL2bt3L9/73vf42c9+xle/+lWef/55otEo1157Lddddx2f/exn+d73vkdfXx933303L7zwAt/85jdpbGzki1/84pBrI7cWtYpYa1m9ejWTJ0/mBz/4AQBf+tKX+P3vf8/3v//9wnkdHR1cf/31nH766Tz66KM899xzfOADH+Cuu+6iqamJyy+/nB/+8IecccYZI/p9ExERkcqUdtIkMgk6Eh2knBQGQzgQJhQIYbGlHt5hTH53tnK1ePFiu3HjxsOOPf/888ydO7dEIzpxfX19+P1+IpHICT2+p6eH+vr6YX2eaDR6zPPyEwXBC9au6+L3+wv3h9pWuly//+WqtbW1sB62VA9d9+qk616dyvm6DwzFPuMj5A8d1k6RzCapCdQwtX7qmI/PGLPJWnvEn8RVQR5HhhNax/LzFK+8YYwphOP8fREREZGB0k6avnQfnclO0k4an/ERDoSpDxy7iDdeKCCLiIiIyElJZVOFnuJyDcXFFJBFRERE5LjlQ3FHsoOMkyn7UFxMAVlEREREjsla67VPZProTHSScQ+F4khgiPlT1npvrnvovet6H8sfS/VD1MA4ytUK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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用 learning_curve 函数生成模型在不同训练样本量下的性能数据\n",
    "# 返回三个数组：训练样本量、训练集分数、验证集分数\n",
    "train_sizes, train_scores, val_scores = learning_curve(\n",
    "    estimator=rfc,                    # 使用已定义的随机森林分类器模型\n",
    "    X=X_train_filtered,               # 训练特征数据\n",
    "    y=y_train,                        # 训练标签数据\n",
    "    train_sizes=np.linspace(0.1, 1.0, 10),  # 生成10个训练样本比例点（从10%到100%）\n",
    "    cv=10,                            # 10折交叉验证，确保结果稳定性\n",
    "    scoring='f1_macro',               # 使用F1宏平均作为评估指标（平衡考虑所有类别）\n",
    "    n_jobs=-1                         # 使用所有CPU核心并行计算，加快训练速度\n",
    ")\n",
    "\n",
    "# 计算不同样本量下训练集分数的均值和标准差\n",
    "train_mean = np.mean(train_scores, axis=1)  # 按行计算均值（每个训练样本量对应一个均值）\n",
    "train_std = np.std(train_scores, axis=1)    # 按行计算标准差，反映分数波动范围\n",
    "\n",
    "# 计算不同样本量下验证集分数的均值和标准差\n",
    "val_mean = np.mean(val_scores, axis=1)      # 同上\n",
    "val_std = np.std(val_scores, axis=1)        # 同上\n",
    "\n",
    "# 创建图形并设置尺寸\n",
    "plt.figure(figsize=(10, 6))  # 图形宽10英寸，高6英寸\n",
    "\n",
    "# 绘制训练集F1分数曲线（红色）\n",
    "plt.plot(train_sizes, train_mean, 'o-', color='r', label='训练集F1分数')  # 圆点连接线\n",
    "\n",
    "# 绘制验证集F1分数曲线（绿色）\n",
    "plt.plot(train_sizes, val_mean, 'o-', color='g', label='验证集F1分数')    # 圆点连接线\n",
    "\n",
    "# 绘制训练集分数的标准差区域（红色半透明）\n",
    "plt.fill_between(\n",
    "    train_sizes,                   # x轴数据（训练样本量）\n",
    "    train_mean - train_std,        # 下限：均值减标准差\n",
    "    train_mean + train_std,        # 上限：均值加标准差\n",
    "    alpha=0.1,                     # 透明度（0.1表示几乎透明）\n",
    "    color='r'                      # 颜色为红色\n",
    ")\n",
    "\n",
    "# 绘制验证集分数的标准差区域（绿色半透明）\n",
    "plt.fill_between(\n",
    "    train_sizes,                   # x轴数据\n",
    "    val_mean - val_std,            # 下限\n",
    "    val_mean + val_std,            # 上限\n",
    "    alpha=0.1,                     # 透明度\n",
    "    color='g'                      # 颜色为绿色\n",
    ")\n",
    "\n",
    "# 设置图形标签和标题\n",
    "plt.xlabel('训练样本比例')          # x轴标签：训练样本占总样本的比例\n",
    "plt.ylabel('F1分数（宏平均）')      # y轴标签：使用的评估指标（F1宏平均）\n",
    "plt.title('学习曲线')               # 图形标题\n",
    "plt.legend()                       # 显示图例，区分训练集和验证集曲线\n",
    "plt.grid(True)                     # 显示网格线，便于观察具体数值\n",
    "plt.tight_layout()                 # 自动调整布局，确保所有元素可见\n",
    "plt.show()                         # 显示图形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4811c4bf",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
